iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
7
Software Development

活用python- 路遙知碼力,日久練成精系列 第 5

Day5- 節約迴圈大作戰,方便的串接與重複運算: 「+」 與 「*」

  • 分享至 

  • xImage
  •  

路遙知碼力,日久練成精-只要在程式之路鑽研的夠深,便能夠充分發揮程式碼的力量; 練習的日子夠久,便能夠練成寫出精簡代碼的能力。

今天來繼續介紹兩個好用的運算子: 「加法」和「乘法」。

對於把字串連寫多次這件事,
很多程式語言並沒有很簡潔的寫法。
我們都知道在python中要宣告一個變數很簡單,
只要用等號賦值就好。例如:

s="Hello"

這樣即宣告了一個變數s,內容是字串"Hello"。
但是如果我們希望字串s的內容是"Hello"連續寫五次呢?
第一個方法就是乖乖把"Hello"打五次,寫:

s="HelloHelloHelloHelloHello"

雖然只要一行,但是若需要寫一百次Hello,豈不是非常占篇幅?
因此通常用for迴圈是比較好的解法:

s=""
for i in range(5):
    s = s + "Hello"
# s 的值變成"HelloHelloHelloHelloHello"

哇,這麼簡單的事情居然就要寫三行,
簡直有違python的簡潔精神。
還好python有很方便的運算子,加法(+)和乘法(*),
如果用在字串或列表上的意思便是「串接」和「重複」。
上述程式其實只需一行,再也不必打一堆迴圈了:

s="Hello" * 5

接著示範更多例子:

>>> "234"+"abc"
'234abc'
>>> "2"+"3"
'23'
>>> "真" * 5 + "高興見到你"
'真真真真真高興見到你'

融會貫通,加法(+)和乘法(*)亦可以用在列表上:

>>> [2,4]+[5,6,9]
[2, 4, 5, 6, 9]
>>> [1] * 6
[1, 1, 1, 1, 1, 1]

有了這樣方便直覺的運算子,
其實可以非常方便的幫助我們繪製各種有趣的圖形。

範例5-1 階梯圖形

教大家如何在螢幕上印出階梯圖形,
我們希望在螢幕上顯示7階的階梯,如下:

*
**
***
****
*****
******
*******

大家可以先停下來想一想怎麼做。












想好了嗎?有字串的重複運算應該不會太難,
觀察圖形,我們要
在第一行印出1顆星星,
在第二行印出2顆星星,

在第i行印出i顆星星。
因此用一層for迴圈遍歷即可:

for i in range(1,8):
    print('*' * i)

(註: 給不熟悉python的朋友,range(a,b)表示起始位置為a(包含a),結束位置為b(不包含b)的整數區間,因此range(1,8)表示i會依序=1, 2, …, 7)

範例5-2 金字塔圖形

教大家如何在螢幕上印出階梯圖形,
我們希望在螢幕上顯示7階的金字塔,如下:

      *
     ***
    *****
   *******
  *********
 ***********
*************

大家也可以先停下來想一想怎麼做。












我們一樣觀察圖形,
第i行需要印的空格數= 總行數 - i
第i行需要印的星星數= 2*i -1
程式如下:

for i in range(1,8):
    print(' ' * (7-i) + '*' * (2*i-1))

範例5-3 菱形星星

教大家如何在螢幕上印出菱形星星,
我們希望在螢幕上顯示到最寬為(7*2-1)個星星的菱形,如下圖:

      *
     ***
    *****
   *******
  *********
 ***********
*************
 ***********
  *********
   *******
    *****
     ***
      *

先停下來想一想怎麼做再往下看答案哦。












想到了嗎?
其實菱形星星我們可以想成是由一個範例3-2的「7階正金字塔」與一個「6階倒金字塔」組合的圖形。
那要如何印出「倒金字塔」呢?
其實就是把列印正金字塔的順序倒著印出來就行了。
這邊再教大家一個內建函數reversed(),倒轉列印的順序。

for i in reversed(range(1,7)):
    print(' ' * (6-i) + '*' * (2*i-1))

結果為一個「6階倒金字塔」:

***********
 *********
  *******
   *****
    ***
     *

因此印出整個菱形可以這樣寫:

for i in range(1,8):
    print(' ' * (7-i) + '*' * (2*i-1))
for i in reversed(range(1,7)):
    print(' ' * (7-i) + '*' * (2*i-1))

注意拼成菱形時,「6階倒金字塔」前面會多一個空格,
因此第四行應寫 print(' ' * (7-i) + '*' * (2*i-1))
而非 print(' ' * (6-i) + '*' * (2*i-1))

課後練習

習題: 密碼不外漏

基於資安,我們知道正常在網頁上登錄頁面輸入密碼欄位時,
密碼欄位都是看不到內容的,避免旁人偷窺。
如圖示:
https://ithelp.ithome.com.tw/upload/images/20190908/20117114kYEaDuMG2E.png

請你實作一個函數hidePassword(),

def hidePassword(psd):
    return #這邊輸入你要回傳的資料

參數psd表示一個非空字串,
在函數中回傳該字串的密碼字,防止別人偷窺密碼悠。

舉例來說:

輸入: psd = "password"
輸出: "********"

輸入: psd = "123"
輸出: "***"

(提示: 需要的工具都在Day4, Day5這兩篇了)


上一篇
Day4- Python內建函數是你的好夥伴,認識max(), min(), len(),sorted(),sum(),abs(), pow()
下一篇
Day6- 超完整python字串函數用法統整
系列文
活用python- 路遙知碼力,日久練成精30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

2
froce
iT邦大師 1 級 ‧ 2019-09-09 07:38:07
def hidePassword(psd):
    return "".join(map(lambda x: "*", psd))

我來亂的。XD

不明 檢舉
【**此則訊息已被站方移除**】
1
ovenchang
iT邦新手 5 級 ‧ 2020-04-15 17:33:29
def hidePassword(psd):
    return '*'*len(psd)
pd=input("psd=")
print("密碼:"+hidePassword(pd))
不明 檢舉
【**此則訊息已被站方移除**】

我要留言

立即登入留言